package Test03;

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Predicate;

//方法引用：引用成员方法
/*
    方法引用（引用成员方法)
    格式
         其他类:其他类对象::方法名
         本类: this ::方法名
         父类: super::方法名
*/
public class Test03 {
    public static void main(String[] args) {
    /* 需求:
        集合中有一些名字，按照要求过滤数据
        数据:"张无忌","周芷若","赵敏","张强","张三丰"
        要求:只要以张开头，而且名字是3个字的
        */

        //1、创建一个集合
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰");

        /*//2、常规方法
        list.stream()
                .filter(s -> s.startsWith("张"))
                .filter(s -> s.length() == 3)
                .forEach(s -> System.out.println(s));*/

        //2、方法引用

        //常规方法
        list.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.startsWith("张") && s.length() == 3;
            }
        }).forEach(s -> System.out.println(s));

        System.out.println("--------");

        //引用其他类
        list.stream()
                .filter(new StringOperation()::stringJudge)
                .forEach(s -> System.out.println(s));

        System.out.println("--------");

        /*//静态方法中是没有this的（main方法是静态的）；只能创建本类的对象
        list.stream()
                .filter(this::stringJudge)
                .forEach(s -> System.out.println(s));*/
        //引用本类
        //通过创建本类对象进行引用
        list.stream()
                .filter(new Test03()::stringJudge)
                .forEach(s -> System.out.println(s));
    }

    public boolean stringJudge(String s) {
        return s.startsWith("张") && s.length() == 3;
    }
}

class StringOperation {
    public boolean stringJudge(String s) {
        return s.startsWith("张") && s.length() == 3;
    }
}
